package com.song.tools.songtest.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.song.tools.core.beans.UserInfo;
import com.song.tools.core.util.ObjectUtils;
import com.song.tools.log.operatelog.service.OperateLogProcessor;
import com.song.tools.songtest.beans.request.OperateLogSaveRequest;
import com.song.tools.songtest.config.DistributedSnowflake;
import com.song.tools.songtest.service.OperateLogService;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

/**
 * 操作日志落库实现
 *
 * @author song tool
 */
@Slf4j
@Service
public class OperateLogIntoDbServiceImpl implements OperateLogProcessor {

    @Resource
    private OperateLogService operateLogService;

    @Resource
    private DistributedSnowflake distributedSnowflake;

    /**
     * 处理用户信息的特定操作。
     * <p>
     * 本函数旨在根据提供的用户信息、模板、模块、操作类型和操作ID，以及扩展信息JSONObject，执行特定的处理逻辑。
     * 这可能是用于记录用户行为、发送通知、更新用户状态等各种与用户操作相关的业务逻辑。
     *
     * @param userInfo   用户信息对象，包含有关执行操作的用户的信息。
     * @param template   模板标识，用于确定操作中使用的特定模板，例如邮件模板、通知模板等。
     * @param module     模块标识，指示操作所在的模块，用于定位具体业务逻辑。
     * @param actionType 操作类型，用于区分不同的操作，例如注册、登录、购买等。
     * @param actionId   操作ID，用于唯一标识特定的操作实例。
     * @param ext        扩展信息，以JSONObject形式提供的额外信息，用于支持操作中的特定需求。
     */
    @Override
    public void process(UserInfo userInfo, String template, String module, String actionType, String actionId, JSONObject ext) {
        log.info("操作日志数据落库start");

        OperateLogSaveRequest request = new OperateLogSaveRequest();
        request.setContext(template);
        request.setLogId(distributedSnowflake.nextId());
        request.setModule(module);
        request.setQueryId(actionId);
        request.setLogType(actionType);
        if (ObjectUtils.isNotEmpty(userInfo)) {
            request.setCreateUser(userInfo.username());
            request.setUserPhone(userInfo.phone());
            request.setCreateUserId(String.valueOf(userInfo.id()));
        }
        if (ObjectUtils.isNotEmpty(ext)) {
            request.setExt(ext.toJSONString());
        }

        operateLogService.save(request);
        log.info("操作日志数据落库end");
    }
}
